標準模組可以這樣做
function CoolModule() {
var something = "cool";
var another = [1, 2, 3];
function doSomething() {
console.log( something );
}
function doAnother() {
console.log( another.join( " ! " ) );
}
return {
doSomething: doSomething,
doAnother: doAnother
};
}
var foo = CoolModule();
foo.doSomething(); // cool
foo.doAnother(); // 1 ! 2 ! 3
這是Revealing Module ( 揭露模組 )的變體。
幹嘛用的呢?先來看程式碼。
要達成真正的模組化,需要兩個條件
另外,模組函式如果改成 IIFE,並將他串到函式展開式,
直接指定,可以得到單一實體。
var foo = (function CoolModule(){
// some variable
// some function
// return literal object
})();
foo.doSomething(); // cool
foo.doAnother(); // 1 ! 2 ! 3
那也因為是模組函式,當然可以放入參數。( 這讓 Tony 漸漸覺得有做 Native 的感覺。)
function CoolModule(id) {
function identify() {
console.log( id );
}
return {
identify: identify
};
}
var foo1 = CoolModule( "foo 1" );
var foo2 = CoolModule( "foo 2" );
foo1.identify(); // "foo 1"
foo2.identify(); // "foo 2"
最後一個強大的功能,修改模組裡面的值。
var foo = (function CoolModule(id) {
function change() {
publicAPI.identify = identify2;
}
function identify1() {
console.log( id );
}
function identify2() {
console.log( id.toUpperCase() );
}
var publicAPI = {
change: change,
identify: identify1
};
return publicAPI;
})( "foo module");
foo.identify(); // foo module
foo.change();
foo.identify(); // FOO MODULE
(這個範例要能夠不斷新增刪除的話,還有很長的路要走。)
因為最重要的部分,有用到 .apply 這在後面章節的 this 才會再解釋。這部分就先略過了。
還沒實現的模組化概念。還是先略過吧。這對 Tony 還是有點吃力。